from django import forms
from django.contrib.auth.models import User
from django.core.exceptions import ValidationError


class LoginForm(forms.Form):
    """
    普通表单类，用户登陆表单，不直接操作数据库
    """
    username = forms.CharField(
        max_length=11,
        label='请输入您的手机号',
        widget=forms.widgets.TextInput(attrs={
            'class': 'layui-input',
            'placeholder':'请输入您的手机号',
            'lay-verity':'required|phone',#LayUI验证规则：必填+手机号格式
            'id':'username'
        })
    )
    password = forms.CharField(
        max_length=20,label='请您输入密码',
        widget=forms.widgets.TextInput(attrs={
            'class': 'layui-input',
            'placeholder':'请您输入密码',
            'id':'password'
        })
    )
    def clean_username(self):
        """
        自定义表单字段username数据清洗函数
        只适用于username的数据清洗，函数名格式必须为clean_表单字段
        必须有return返回值
        """
        #获取清洗后的数据（cleaned_data函数）
        username = self.cleaned_data['username']
        if len(username) ==11:
            return username
        else:
            #验证失败抛出异常，错误显示在表单上
            raise ValidationError('用户名应为手机号')

class LoginModelForm(forms.ModelForm):
    """
    模型表单类，继承自ModelForm,可以直接操作数据库
    """
    class Meta:
        """
        重新定义Meta类，分别设置属性model、field、labels、error_messages、widgets
        并且自定义表单字段username的数据清洗函数
        """
        model = User
        fields = ('username', 'password')
        #字段标签，覆盖模型中的verbose_name
        labels = {
            'username':'请输入您的手机号',
            'password': '请输入您的密码',
        }
        error_messages = {
            '__all__':{
                'required':'请输入内容',#必填字段
                'invalid':'请检查输入'#格式错误
            },
        }
        #自定义表单控件属性
        widgets = {
            'username': forms.TextInput(attrs={
                'class': 'layui-input',
                'placeholder':'请输入您的手机号',
                'lay-verify':'required|phone',#LayUI验证规则：必填+手机号格式
                'id':'username'
            }),
            'password': forms.PasswordInput(attrs={
                'class': 'layui-input',
                'placeholder':'请您输入密码',
                'lay-verify':'required|password',
                'id':'password'
            })
        }
    def clean_username(self):
        username = self.cleaned_data['username']
        if len(username) == 11:
            return username
        else:
            raise ValidationError('用户名应为手机号')
